package org.sean.framework.canary.config;

import org.sean.framework.canary.loadbalancer.CanaryLoadBalancer;
import org.sean.framework.canary.loadbalancer.CanaryServicesSupplier;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;

public class LoadBalancerConfiguration {

    @Bean
    ReactorLoadBalancer<ServiceInstance> canaryLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new CanaryLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }

    @Bean
    public ServiceInstanceListSupplier canaryServicesSupplier(
            ConfigurableApplicationContext context) {
        return new CanaryServicesSupplier(ServiceInstanceListSupplier.builder().withBlockingDiscoveryClient().withCaching().build(context));
    }

}
